package hihocode;

import java.util.Scanner;

//分数调查，比如知道a比b高几分，c比b高几分，求a比b高几分
//一道并查集题目，但是就是怎么也想不出来该怎么写
// 带权并查集操作
public class ScoreInvestigation1515 {

	//让每个集合的点 存的都是它与头结点的差值
	private static class UF{
		int[] id;
		//存储的是该点与头结点的差值
		int[] scores;
		
		public UF(int n){
			id = new int[n];
			scores = new int[n];
			for(int i = 0; i < n; i++){
				id[i] = i;
			}
		}

		private int find_1(int p){
	        if (p == id[p]) return p;
	        return id[p] = find(id[p]);
		}
		//添加元素的时候，注意更新相应的差值
		//遇到一个问题，比如1 -> 2 -> 3
		//4 -> 5
		//如果union 2 和5，那么3 -> 5, 因为我们只知道此时处于2，那么1的值怎么更新呢
		//见下面的实现
		public void union_1(int i, int j, int score) {
			//找到i，j所在集合的代表元素
			int rp = find(i);
	        int rq = find(j);
	        if (rp == rq) return;
	        
	        id[rq] = rp;
	        //注意i和j可能属于不同的集合，我们需要更新整个集合的值
	        while(i != id[i]){
	        	scores[i] = scores[j] + score;
	        	i = id[i];
	        }
		}
		
		private int find(int p){
			if (p == id[p])
				return p;
			int root = find(id[p]);
			//比如要判断3 5
			//3代表元素是1
			//5 -> 4 -> 1
			//scores[4]  += (scores[1] = 0)
			//因为scores[4]我们在连接2 5 的时候更新过了
			//然后scores[5] += scores[4]
			//因为之前5比4大10, 所以scores[5] = 10,在未连接2 5 时 scores[4]为0
			//现在scores[4] = -30
			//相应的scores[5]也更新成10 + -30 = -20
			//也就是说通过这种方式我们更新了在某个结点前面的值
			scores[p] += scores[id[p]];
			return id[p] = root;
	    }
		
		public void union(int i, int j, int score) {
			//找到i，j所在集合的代表元素
			int rp = find(i);
	        int rq = find(j);
	        if (rp == rq) return;
	        
	        id[rq] = rp;
	        //注意i和j可能属于不同的集合，我们需要更新整个集合的值
//	        while(i != id[i]){
//	        	scores[i] = scores[j] + score;
//	        	i = id[i];
//	        }
	        //注意，这儿是重点
	        //因为我们连接两个集合了，所以我们把其中一个集合的头元素的分数更新
	        //假设rq的分数为z，当然我们不知道z的值
	        //注意这个scores[i]表示i比当前集合代表元素低的值，所以z - scores[j] = j的分数
	        // z - scores[j] + score = i的分数 = score[rep](i的代表元素的分数) - scores[i]
	        // score[rep] - z = scores[i] + score - scores[j];
	        // score[rep] - z表示rq比代表元素低的分数即scores[rq]
	        // scores[rq] = scores[i] + score - scores[j];
	        
	        //按照上面的，那我们将scores变为正的
	        // z + scores[j] + score = i的分数 = score[rep](i的代表元素的分数) + scores[i]
	    	// z - score[rep] = scores[i] - score - scores[j];
	        scores[rq] = scores[i] - score - scores[j];
		}
		
		public boolean isUnion(int i, int j){
			return find(i) == find(j);
		}
	}
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n, m ,q;
		while(scanner.hasNext()){
			n = scanner.nextInt();
			m = scanner.nextInt();
			q = scanner.nextInt();
			UF uf = new UF(n);
			for(int i = 0; i < m; i++){
				int x = scanner.nextInt();
				int y = scanner.nextInt();
				int score = scanner.nextInt();
//				if(x > y){
//					int temp = x;
//					x = y;
//					y = temp;
//					score = -score;
//				}
				uf.union(x - 1, y - 1, score);
			}
//			for(int i = 0; i <= 5; i++){
//				System.out.println(i + " uf.id: " + uf.id[i] + " uf.scores: " + uf.scores[i]);
//			}
			//判断查询
			for(int j = 0; j < q; j++){
				int x = scanner.nextInt();
				int y = scanner.nextInt();
				x--;
				y--;
				//注意，这里调用了find(x)和find(y)
				//更新了y所在集合对x集合的分数
				//还是以 1 -> 2 -> 3 
				//4 -> 5 -> 6为例
				//然后连接2 5
				if(uf.isUnion(x, y) ){
					//System.out.println(uf.scores[y] - uf.scores[x]);
					System.out.println(uf.scores[x] - uf.scores[y]);
				}else{
					System.out.println(-1);
				}
			}
		}
		scanner.close();
	}
}
